package com.hygj.controller;

import com.hygj.pojo.Role;
import com.hygj.pojo.User;
import com.hygj.search.UserSearch;
import com.hygj.service.*;
import com.hygj.util.PageUtil;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Shiro登录认证 原理：
 * 1、用户提交 用户名和密码
 * 2、 shiro 封装令牌
 * 3、realm 通过用户名将密码查询返回
 * 4、shiro自动去比较查询出密码和用户输入密码是否一致
 * 5、进行登陆控制
 */
@Controller
@RequestMapping
public class UserController {

    @Autowired
    private UserService userService;

    @Resource
    private UserRoleService userRoleService;

    @Resource
    private RoleService roleService;



    /**
     * 登录login验证-----验证用户名和密码
     *
     * @param request
     * @return
     */
    @RequestMapping("checkLogin")
    public String doLogin(HttpServletRequest request, ModelMap modelMap, User user) {

        if ((user.getUsername() == null || user.getUsername().length() <= 0)
                && (user.getPassword() == null || user.getPassword().length() <= 0)) {
            modelMap.put("no", "用户名或者密码不能为空！");
            return "login";
        } else {
            // 取得用户名
            String username = request.getParameter("username");
            // 取得 密码，并用MD5加密
            String password = DigestUtils.md5Hex(user.getPassword());
            // 用户名/密码的认证机制,并创建令牌
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            // 通过SecurityUtils工具类，获取当前的用户，然后通过调用login方法提交认证
            Subject subject = SecurityUtils.getSubject();
            try {
                //验证角色和权限,进入===【ShiroRealm.java】===身份登录认证
                subject.login(token);
            } catch (Exception e) {
                e.printStackTrace();
                modelMap.put("msg", "用户或密码错误！");
                return "login";
            }
            
            return "redirect:admin";
        }

    }

    /**
     * 添加用户----增加用户与角色的关系，并保存用户
     * String roles 是从表单提交 name="userrole"  带来的参数
     *
     * @param
     * @return
     */
    @RequestMapping("userInsert")
    public String userInsert(User user, @RequestParam(value = "userrole") String[] roles) {
        //StringUtils.join把数组中的元素连接成一个字符串返回。
        user.setPassword(DigestUtils.md5Hex(user.getPassword()));
        userService.saveUserwithRole(user, StringUtils.join(roles, ","));
        return null;
    }


    /**
     * 查询全部----用户和角色(列表显示)
     *
     * @param map
     * @param request
     * @return
     */
    @RequestMapping("getUserWithRoleAll")
    public String getUserRoleAll(@ModelAttribute("search") UserSearch user, Map<String, Object> map, HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        //第一步：判断长度，是否为空
        if (StringUtils.isNotBlank(user.getUsername())) {
            params.put("username", "%" + user.getUsername() + "%");
        }
        /*if (StringUtils.isNotBlank(user.getUsername())) {
			params.put("username", "%" + user.getUsername() + "%");
		}*/
        //第二步：分页查询
        PageUtil<User> page = userService.page(request, 10, params);
        //第三步：把page里的数据拿出开放进【list】集合里
        List<User> users = page.getLists();
        for (User userss : users) {
            userss.setRoles(userRoleService.listRoles(userss.getUid()));
        }
        //第四步：查询用户角色
        List<Role> roles = roleService.listAll("listAll", params);
        ///第五步：list转换成Map,用for循环出来
        Map<String, String> _r = new HashMap<String, String>();
        for (Role roless : roles) {
            _r.put("" + roless.getRid(), roless.getRole_name());
        }
        map.put("roles", _r);

        map.put("page", page);
        map.put("search", user);
        return "home/admin/user/user_show";
    }


    /**
     * 用户信息回显 ----修改用户信息用
     *
     * @param map
     * @param
     * @return
     */
    @RequestMapping("getUserUpdate")
    public String getUserRoleAlls(@RequestParam("inform") Integer id, Map<String, Object> map) {
        //查询用户信息
        User user = userService.getById("getById", id);

        //查询角色信息
        Map<String, Object> params = new HashMap<String, Object>();
        List<Role> page = roleService.listAll("listAll", params);
        // list转换成Map
        Map<String, String> _r = new HashMap<String, String>();
        for (Role role : page) {
            _r.put("" + role.getRid(), role.getRole_name());
        }
        //通过上面查询的user信息，获取 该用户的角色 --getListRoles（pojo一个用户可以有多个角色）
        List<Role> userRoles = user.getRoles();
        Map<String, String> userRoleCheck = new HashMap<>();
        for (Role role : userRoles) {
            userRoleCheck.put(role.getRid() + "", role.getRole_name());
        }

        map.put("userRoleCheck", userRoleCheck);
        map.put("roles", _r);
        map.put("users", user);
        return "admin/admin_user/user_update";
    }


    /**
     * 用户信息--修改
     *
     * @param user
     * @param roles
     * @return 其中value等于"userrole" 是从前台user_update.jsp页中 字段 name等于"userrole"带来的值。
     */
    @RequestMapping("updateUserRoleAlls")
    public String updateUserRoleAlls(User user, @RequestParam(value = "userrole") String[] roles) {
        userService.saveUserwithRole(user, StringUtils.join(roles, ","));
        return "redirect:getUserWithRoleAll";
    }


    /**
     * 查询全部
     *
     * @param map
     * @param request
     * @return
     */
    @RequestMapping("getLoginAll")
    public String getLoginAll(Map<String, Object> map, HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        PageUtil<User> page = userService.page(request, 10, params);
        map.put("page", page);
        return "logins/registerShow";
    }

    /**
     * 删除
     *
     * @param id
     * @return
     * @RequestParam("id")其中id是
     */
    @RequestMapping("deleteLogin")
    public String deleteLogin(@RequestParam("id") Integer id) {
        userRoleService.delete("delete", id);
        userService.delete("delete", id);
        return "redirect:getUserWithRoleAll";
    }


    /**
     * 删除，多项删除 @RequestParam("inform")引入 选择框 inform
     * ===><input type="checkbox" name="inform">
     *
     * @return
     */
    @RequestMapping("delete_user")
    public String delete_user(@RequestParam("inform") Integer[] ids) {
        userService.delete(ids);
        return "redirect:getUserWithRoleAll";
    }


    /**
     * 退出
     *
     * @return
     */
    @RequestMapping("logout")
    public String logout() {
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        return "login";
    }

}
